package ventanas;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Rectangle;
import java.util.Calendar;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import negocio.ObraSocial;
import negocio.Paciente;
import negocio.PlanCobertura;
import negocio.Sistema;
import controladores.ControladorABMPaciente;
import com.toedter.calendar.*;

public class VentanaABMPaciente extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel panelDatosPaciente;
	private JDateChooser dcFechaNacimiento;
	private JPanel panel1;
	private JCheckBox chkModificarPaciente = new JCheckBox("Modificar Datos del Paciente");
	private JCheckBox chkPoseeobrasocial = new JCheckBox("Posee Obra Social");
	private JComboBox<ObraSocial> comboObraSocial;
	private JComboBox<PlanCobertura> comboPlanes;
	private JComboBox<String> comboTipoDoc;
	private JTextField txtApellido;
	private JTextField txtTelefono;
	private JTextField txtNroDocumento;
	private JTextField txtDireccion;
	private JTextField txtNombre;
	private JTextField txtLocalidad;
	private JTextField txtNumeroCalle;
	private JTextField txtNroAfiliado;
	private JLabel JTelefono;
	private JLabel lblObraSocial;
	private JLabel lblPlan;
	private JLabel lblDireccion;
	private JLabel lblNumeroDoc;
	private JLabel lblTipoDoc;
	private JLabel JApellido;
	private JLabel JNombre;
	private JLabel lblNroAfiliado;
	private JButton btnCancelar;
	private JButton btnBajaPaciente = new JButton("Dar de Baja Paciente");
	private JButton btnAceptar;
	private Sistema s;
	private ControladorABMPaciente controlador;
	private Paciente paciente;
	private JLabel lblMensaje;

	public VentanaABMPaciente(Paciente paciente){
		this.s = Sistema.obtenerInstancia();
		this.paciente = paciente;
		this.controlador = new ControladorABMPaciente(this, paciente);
		initComponents();
		cargarDatosPrevios();
		agregarActionListeners();
	}
	
	private void initComponents() {
		panelDatosPaciente = new JPanel();
		panelDatosPaciente.setBounds(25, 14, 401, 178);
		dcFechaNacimiento = new JDateChooser();
		panel1 = new JPanel();
		panel1.setBounds(25, 214, 390, 141);
		comboObraSocial = new JComboBox<ObraSocial>();
		comboPlanes = new JComboBox<PlanCobertura>();
		lblNroAfiliado = new JLabel();
		txtNroAfiliado = new JTextField();
		btnCancelar = new JButton();
		btnCancelar.setBounds(218, 440, 197, 26);
		btnAceptar = new JButton();
		btnAceptar.setBounds(25, 440, 166, 26);
		btnBajaPaciente = new JButton();
		btnBajaPaciente.setBounds(25, 366, 166, 23);
		btnBajaPaciente.setText("Dar de Baja Paciente");
	
		//======== this ========
		{
			this.setTitle("Paciente");
			this.setIconImage(new ImageIcon("/Seminario-Cliente/src/Images/mas.png").getImage());
			this.setAlwaysOnTop(true);
			this.setResizable(false);
			Container thisContentPane = this.getContentPane();
	
			//======== panelDatosPaciente ========
			{
				panelDatosPaciente.setBorder(new TitledBorder("Datos Paciente"));
				panelDatosPaciente.setLayout(null);
				
				panelDatosPaciente.add(dcFechaNacimiento);
				dcFechaNacimiento.setBounds(146, 144, 233, 20);
				{
					JNombre = new JLabel();
					panelDatosPaciente.add(JNombre);
					JNombre.setText("Nombre:");
					JNombre.setBounds(8, 44, 66, 16);
				}
				{
					JApellido = new JLabel();
					panelDatosPaciente.add(JApellido);
					JApellido.setText("Apellido:");
					JApellido.setBounds(202, 44, 72, 16);
				}
				{
					lblTipoDoc = new JLabel();
					panelDatosPaciente.add(lblTipoDoc);
					lblTipoDoc.setText("Tipo Doc:");
					lblTipoDoc.setBounds(8, 83, 66, 16);
				}
				{
					lblNumeroDoc = new JLabel();
					panelDatosPaciente.add(lblNumeroDoc);
					lblNumeroDoc.setText("Nro Doc:");
					lblNumeroDoc.setBounds(202, 83, 72, 16);
				}
				{
					JTelefono = new JLabel();
					panelDatosPaciente.add(JTelefono);
					JTelefono.setText("Telefono:");
					JTelefono.setBounds(202, 117, 72, 16);
				}
				
				{
					lblDireccion = new JLabel();
					panelDatosPaciente.add(lblDireccion);
					lblDireccion.setText("Direcci\u00F3n:");
					lblDireccion.setBounds(9, 117, 65, 16);
				}
				{
					txtNombre = new JTextField();
					panelDatosPaciente.add(txtNombre);
					txtNombre.setBounds(84, 42, 108, 20);
				}
				{
					txtApellido = new JTextField();
					panelDatosPaciente.add(txtApellido);
					txtApellido.setBounds(284, 42, 95, 20);
				}
				{
					txtDireccion = new JTextField();
					panelDatosPaciente.add(txtDireccion);
					txtDireccion.setBounds(84, 113, 108, 20);
				}
				{
					txtNroDocumento = new JTextField();
					panelDatosPaciente.add(txtNroDocumento);
					txtNroDocumento.setBounds(284, 81, 95, 20);
				}
				{
					txtTelefono = new JTextField();
					panelDatosPaciente.add(txtTelefono);
					txtTelefono.setBounds(284, 115, 95, 20);
				}

				{ // compute preferred size
					Dimension preferredSize = new Dimension();
					for(int i = 0; i < panelDatosPaciente.getComponentCount(); i++) {
						Rectangle bounds = panelDatosPaciente.getComponent(i).getBounds();
						preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
						preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
					}
					Insets insets = panelDatosPaciente.getInsets();
					preferredSize.width += insets.right;
					preferredSize.height += insets.bottom;
					panelDatosPaciente.setMinimumSize(preferredSize);
				}
			}
			getContentPane().setLayout(null);
			thisContentPane.add(panelDatosPaciente);
			JLabel lblFechaNacimiento_1 = new JLabel("Fecha Nacimiento:");
			lblFechaNacimiento_1.setBounds(8, 144, 149, 20);
			panelDatosPaciente.add(lblFechaNacimiento_1);
			
			//---- cbxTipoDoc ----
			comboTipoDoc = new JComboBox<String>();
			DefaultComboBoxModel<String> modelo = new DefaultComboBoxModel<>();
			modelo.addElement("DNI");
			modelo.addElement("PAS");
			modelo.addElement("LC");
			modelo.addElement("LE");
			comboTipoDoc.setModel(modelo);
			comboTipoDoc.setBounds(84, 81, 109, 20);
			panelDatosPaciente.add(comboTipoDoc);
			
			//---- chkModificarPaciente ----			
			chkModificarPaciente.setBounds(6, 14, 202, 23);
			panelDatosPaciente.add(chkModificarPaciente);
	
			
			//======== panelDatosOS ========
			{
				panel1.setBorder(new TitledBorder("Datos de Cobertura"));
				panel1.setLayout(null);
	
				//---- cbxObraSocial ----
				panel1.add(comboObraSocial);
				comboObraSocial.setBounds(148, 53, 206, 20);
				
				DefaultComboBoxModel<ObraSocial> modeloOS = new DefaultComboBoxModel<ObraSocial>();
				List<ObraSocial> obrasSociales = s.obtenerObraSociales();
				
				for(ObraSocial os:obrasSociales){
					modeloOS.addElement(os);
				}
	
				comboObraSocial.setModel(modeloOS);
				
				
				//---- cbxPlanes ----
				comboPlanes.setModel(new DefaultComboBoxModel<PlanCobertura>());	
				panel1.add(comboPlanes);
				comboPlanes.setBounds(148, 84, 206, 20);
	
				//---- lblNroAfiliado ----
				lblNroAfiliado.setText("Numero de afiliado:");
				panel1.add(lblNroAfiliado);
				lblNroAfiliado.setBounds(10, 115, 128, 14);
	
				//---- txtNroAfiliado ----
				panel1.add(txtNroAfiliado);
				txtNroAfiliado.setBounds(148, 115, 206, 20);
				{
					lblPlan = new JLabel();
					panel1.add(lblPlan);
					lblPlan.setText("Plan: ");
					lblPlan.setBounds(10, 85, 45, 16);
				}
				{
					lblObraSocial = new JLabel();
					panel1.add(lblObraSocial);
					lblObraSocial.setText("Obra Social: ");
					lblObraSocial.setBounds(10, 55, 95, 16);
				}

				{ // compute preferred size
					Dimension preferredSize = new Dimension();
					for(int i = 0; i < panel1.getComponentCount(); i++) {
						Rectangle bounds = panel1.getComponent(i).getBounds();
						preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
						preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
					}
					Insets insets = panel1.getInsets();
					preferredSize.width += insets.right;
					preferredSize.height += insets.bottom;
					panel1.setMinimumSize(preferredSize);
				}
			}
			thisContentPane.add(panel1);
			chkPoseeobrasocial.setBounds(10, 26, 150, 23);
			
			panel1.add(chkPoseeobrasocial);
	
			//---- btnAceptar ----
			btnAceptar.setText("Modificar Datos");
			btnAceptar.setIcon(new ImageIcon("/Seminario-Cliente/src/Images/tildeOKpequeno.jpg"));
			thisContentPane.add(btnAceptar);

			//---- btnCancelar ----
			btnCancelar.setText("Cancelar");
			btnCancelar.setIcon(new ImageIcon("/Seminario-Cliente/src/Images/cruzCancelar.jpg"));
			thisContentPane.add(btnCancelar);

			{ // compute preferred size
				Dimension preferredSize = new Dimension();
				for(int i = 0; i < thisContentPane.getComponentCount(); i++) {
					Rectangle bounds = thisContentPane.getComponent(i).getBounds();
					preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
					preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
				}
				Insets insets = thisContentPane.getInsets();
				preferredSize.width += insets.right;
				preferredSize.height += insets.bottom;
				thisContentPane.setMinimumSize(preferredSize);
				thisContentPane.setPreferredSize(new java.awt.Dimension(436, 479));
			}
			getContentPane().add(btnBajaPaciente);
			{
				lblMensaje = new JLabel("");
				lblMensaje.setBounds(12, 402, 403, 32);
				getContentPane().add(lblMensaje);
			}
			this.setVisible(true);
			this.pack();
			this.setSize(609, 507);
			this.setLocationRelativeTo(null);
		}
	}
	
	private void cargarDatosPrevios(){
		if (this.paciente != null){
			txtDireccion.setText(paciente.getDireccion());
			txtApellido.setText(paciente.getApellido());
			txtNombre.setText(paciente.getNombre());
			txtNroDocumento.setText("" + paciente.getNumeroDocumento());
			txtTelefono.setText("" + paciente.getTelefono());
			Calendar c = paciente.getFechaNacimiento();
			dcFechaNacimiento.setDate(c!=null?c.getTime():null);
			cargarCombos();
			txtNroAfiliado.setText(paciente.getNroDeAfiliado());
			deshabilitarCamposPaciente();
			deshabilitarCamposObrasSociales();
		}	
	}
	
	private void cargarCombos(){
		DefaultComboBoxModel<ObraSocial> modeloOS = ((DefaultComboBoxModel<ObraSocial>)comboObraSocial.getModel());
		DefaultComboBoxModel<PlanCobertura> modeloPlan = ((DefaultComboBoxModel<PlanCobertura>)comboPlanes.getModel());
		DefaultComboBoxModel<String> modeloTipoDoc = ((DefaultComboBoxModel<String>)comboTipoDoc.getModel());
		
		for(int i=0; i<modeloOS.getSize() ;i++){
			if(modeloOS.getElementAt(i).equals(paciente.getObraSocial())){
				modeloOS.setSelectedItem(modeloOS.getElementAt(i));
			}
		}
		
		for(int i=0; i<modeloTipoDoc.getSize() ;i++){
			if(modeloTipoDoc.getElementAt(i).equals(paciente.getTipoDocumento())){
				modeloTipoDoc.setSelectedItem(modeloTipoDoc.getElementAt(i));
			}
		}
		
		if(paciente.getObraSocial()!=null){
			for(PlanCobertura plan: paciente.getObraSocial().getPlanes()){
				modeloPlan.addElement(plan);
			}
		}
		
		for(int i=0; i<modeloPlan.getSize() ;i++){
			if(modeloPlan.getElementAt(i).equals(paciente.getPlan())){
				modeloPlan.setSelectedItem(modeloPlan.getElementAt(i));
			}
		}
	}
	
	public void habilitarCamposPaciente(){
		txtNombre.setEditable(true);
		txtApellido.setEditable(true);
		txtDireccion.setEditable(true);
		txtNroDocumento.setEditable(true);
		txtTelefono.setEditable(true);
		comboTipoDoc.setEditable(true);
		dcFechaNacimiento.setEnabled(true);
		comboTipoDoc.setEnabled(true);
	}
	
	public void deshabilitarCamposPaciente(){
		txtNombre.setEditable(false);
		txtApellido.setEditable(false);
		txtDireccion.setEditable(false);
		txtNroDocumento.setEditable(false);
		txtTelefono.setEditable(false);
		comboTipoDoc.setEditable(false);
		dcFechaNacimiento.setEnabled(false);
		comboTipoDoc.setEnabled(false);
	}
	
	public void habilitarCamposObrasSociales(){
		comboPlanes.setEnabled(true);
		comboObraSocial.setEnabled(true);
		txtNroAfiliado.setEditable(true);
	}
	
	public void deshabilitarCamposObrasSociales(){
		comboPlanes.setEnabled(false);
		comboObraSocial.setEnabled(false);
		txtNroAfiliado.setEditable(false);
	}
	
	private void agregarActionListeners(){
		chkModificarPaciente.addActionListener(controlador);
		chkPoseeobrasocial.addActionListener(controlador);
		comboObraSocial.addActionListener(controlador);
		btnBajaPaciente.addActionListener(controlador);
		btnAceptar.addActionListener(controlador);
		btnCancelar.addActionListener(controlador);
	}
	
	public boolean camposVacios(){
		if(txtNombre.getText().equals("") ||
				txtApellido.getText().equals("")||
				txtTelefono.getText().equals(""))
			return true;
		return false;
	}
	
	//getters y setters
	public JDateChooser getDcFechaNacimiento() {
		return dcFechaNacimiento;
	}
	
	public JComboBox<ObraSocial> getComboObraSocial() {
		return comboObraSocial;
	}
	
	public JComboBox<PlanCobertura> getComboPlanes() {
		return comboPlanes;
	}
	
	public JComboBox<String> getComboTipoDoc() {
		return comboTipoDoc;
	}
	
	public JButton getBtnCancelar() {
		return btnCancelar;
	}
	
	public JButton getBtnBajaPaciente() {
		return btnBajaPaciente;
	}
	
	public JButton getBtnAceptar() {
		return btnAceptar;
	}
	
	public JTextField getTxtApellido() {
		return txtApellido;
	}
	
	public JTextField getTxtTelefono() {
		return txtTelefono;
	}
	
	public JTextField getTxtNroDocumento() {
		return txtNroDocumento;
	}
	
	public JTextField getTxtDireccion() {
		return txtDireccion;
	}
	
	public JTextField getTxtNombre() {
		return txtNombre;
	}
	
	public JTextField getTxtLocalidad() {
		return txtLocalidad;
	}
	
	public JTextField getTxtNumeroCalle() {
		return txtNumeroCalle;
	}
	
	public JTextField getTxtNroAfiliado() {
		return txtNroAfiliado;
	}
	
	public JCheckBox getChkModificarPaciente() {
		return chkModificarPaciente;
	}
	
	public JCheckBox getChkPoseeobrasocial() {
		return chkPoseeobrasocial;
	}
	
	public Paciente getPaciente() {
		return paciente;
	}
	
	public void setPaciente(Paciente p) {
		this.paciente = p;
	}

	public JLabel getLblMensaje() {
		return lblMensaje;
	}
}